from typing import List

from ninja_extra import api_controller, route
from ninja_extra.pagination import paginate, PageNumberPaginationExtra
from ninja_extra.ordering import ordering, Ordering  # 单独排序，全局排序需要自定义类和settings中配置
from ninja_extra.schemas import PaginatedResponseSchema

from .models import SKU
from .schema import SKUSchemaOut
from meiduo_mall.base.schemas import Message


@api_controller('categories/', tags=['商品类别'], )
class SKUController:
    """
    装饰器的代码有执行顺序，从上到下的顺序分行，如果排序在分布上面，则结果就没有排序的效果，先分页再排序

    """
    # 当使用  ninja_extra.pagination.LimitOffsetPagination　时, 你应该使用
    # NinjaPaginationResponseSchema 作为分页响应模式包装器。
    @route.get('{cat_id}/skus/', response={200: PaginatedResponseSchema[SKUSchemaOut], 400: Message})
    @paginate(PageNumberPaginationExtra, page_size=5)
    # @paginate 不添加参数则使用默认分页类ninja_extra.pagination.LimitOffsetPagination
    @ordering(Ordering, ordering_fields=['created_at', 'price', 'sales'])  # 指定排序字段
    # @ordering # 不指定排序字段
    def sku(self, cat_id: int):
        if cat_id:
            qs = SKU.objects.filter(is_launched=True, category_id=cat_id)
            return qs  # 加了状态码则不会被排序
        return 400, {'msg': '缺少查询参数'}  # 不加状态码则不会正常返回

    """
    # Django project settings.py
    # 分页可以单独配置，也可以全局配置，参考文档
    INSTALLED_APPS = [
        ...
    ]
    NINJA_EXTRA={
        'PAGINATION_CLASS': 'ninja_extra.pagination.PageNumberPaginationExtra'
    }
    """
